package cn.ljy.mes.model;

import cn.ljy.common.model.BaseModel;
import cn.ljy.common.model.validate.AddWorkValidation;
import cn.ljy.common.model.validate.UpdateWorkValidation;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * 物料库存表
 * @author ljy
 * @date 20250419
 * 备注：
 * 物料表和物料库存表是一对多关联，实际为一对一关联。也就是一个物料表只有一个物料库存
 * 在添加物料表记录的时候，要求同步添加物料库存表；为了避免部分历史问题，该模块还是增加了添加操作，但是如果某物料已经有了库存，则添加失败；
 * 物料库存表没有删除功能，如果要删除应该是在物料模块关联删除。
 * 关联插入的SQL语句（用于初次创建物料库存表时）：
 * INSERT INTO wms_material_inventory (id,material_id, inventory_limit,inventory_lower,create_time)
 * SELECT uuid(),id,10000+FLOOR(RAND() * 10000),FLOOR(RAND() * 10000),now()
 * FROM mes_material;
 */
@ApiModel(value="物料库存表")
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false,of = {"id"})
public class WmsMaterialInventory extends BaseModel {
    @NotBlank(groups = UpdateWorkValidation.class,message="id不能为空")
    private String id;
    @NotNull(groups = AddWorkValidation.class,message="物料不能为空")
    private MesMaterial material;//物料
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private Long totalInventory;//总库存数，由系统根据业务过程决定数量
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private Long lockQuantity;//锁定数量（由业务决定），出库数量不能大于（库存数量-锁定数量）
    @NotNull(message="锁定状态不能为空")
    private Boolean isLock;//是否锁定商品库存，锁定后无法进行出入库
    @NotNull(message="库存上限不能为空")
    @Range(min = 0,message = "库存上限的值必须大于等于{min}")
    private Long inventoryLimit;//库存上限
    @NotNull(message="库存下限不能为空")
    @Range(min = 0,message = "库存下限的值必须大于等于{min}")
    private Long inventoryLower;//库存下限
    //非数据库字段
    private Integer seatNumber;//库位数量
    private List<WmsMaterialInventoryDetail> materialInventoryDetails;//库位详情集合。

    public WmsMaterialInventory(String id) {
        this.id = id;
    }
}
